package cnsatmsmart.automation.mmi.controller.Buffer;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

/**
 * Merupakan kelas yang berisi list dari data pesawat
 * @author SIK - PTIK, BPPT
 */
public class FlightList
{
    /**
     * Atributes
     */
        private List<Flight> ListOfFlight = new ArrayList<Flight>();
    
    /**
     * Mengembailkan index dari sebuah pesawat yang diketahui call sign-nya di List of Flight
     * @param callSign Call Sign pesawat yang ingin dicari
     * @return
     */
        private int getIndexOfFlight (String callSign)
        {
            int tempIdx = -1;

            //Mengiterasi seluruh elemen list of flight untuk mendapatkan call sign yang diinginkan
            for (int i = 0; i < ListOfFlight.size(); i++)
            {
                if (ListOfFlight.get(i).getCallSign().equals(callSign))
                {
                    tempIdx = i;
                }
            }
            return (tempIdx);
        }

        /**
         * Menghapus data pesawat yang diketahui call sign-nya di list of flight
         * @param callSign Call Sign pesawat yang ingin dihapus datanya
         */
        private void RemoveFlight (String callSign)
        {
            //Mengiterasi seluruh elemen list of flight untuk mendapatkan call sign yang diinginkan
            for (int i = 0; i < ListOfFlight.size(); i++)
            {
                if (ListOfFlight.get(i).getCallSign().equals(callSign))
                {
                    ListOfFlight.remove(i);
                }
            }
        }

        /**
         * Menambahkan data pesawat ke list of flight
         * Add Flight to ListOfFlight
         * @param code Code peswat
         * @param callSign Call sign pesawat
         * @param country Country pesawat
         * @param altitude Altitude pesawat
         * @param groundspeed Grounspeed pesawat
         * @param trackangle Trackangle pesawat
         * @param verticalrate Verticalrate pesawat
         * @param latitude Latitude pesawat
         * @param longitude longitude pesawat
         * @param timeOfDay Time of day pesawat
         * @throws IOException
         */
        public void addData (String code, String callSign, String country, float altitude, float groundspeed, float trackangle, float verticalrate, float latitude, float longitude, String timeOfDay) throws IOException
        {
            //Current time in seconds (from 1 Jan 1970)
            Calendar now = Calendar.getInstance();
            long lastUpdate = now.getTimeInMillis()/1000;
            int state = 0;

            synchronized (ListOfFlight)
            {
                int i = getIndexOfFlight(callSign);
                if (i != -1)
                {
                    //Menandakan data pesawat telah ada di dalam list of flight, kemudian membandingkan altitudenya
                    //State = 1, berarti pesawat dalam keadaan naik
                    //State = -1, berarti pesawat dalam keadaan turun
                    //State = 0, berarti pesawat dalam keadaan mendatar
                    if (altitude > ListOfFlight.get(i).getAltitude()) state = 1;
                    else if(altitude < ListOfFlight.get(i).getAltitude()) state = -1;
                    else if(altitude == ListOfFlight.get(i).getAltitude()) state = 0;
                    ListOfFlight.remove(i);     //Data pesawat lama dihapus
                }

                //Data pesawat baru ditambahkan
                Flight CFlight = new Flight(code, callSign, country, altitude, groundspeed, trackangle, verticalrate, latitude, longitude, timeOfDay, lastUpdate, state);
                ListOfFlight.add(CFlight);
            }
        }

        /**
         * @return List of flight
         */
        public List<Flight> getFlightList()
        {
            //Membuat list sementara
            List<Flight> temp = new ArrayList<Flight>();

            synchronized (ListOfFlight){
                for (int i = 0; i < ListOfFlight.size(); i++){
                    //Data pesawat dari list yang lama ditambahkan ke list sementara dengan copy constructor
                    temp.add(new Flight(ListOfFlight.get(i)));
                }
            }
            //Mengembalikan list sementara
            return (temp);
        }

        /**
         * Melakukan pengecekan terhadap list of flight,
         * jika ada data pesawar yang tidak diperbaharui dalam waktu 30 detik, maka akan dihapus dari list
         */
        public void OffCheck()
        {
            Calendar now;

            synchronized (ListOfFlight)
            {
                for (int i = 0; i < ListOfFlight.size(); i++)
                {
                    now = Calendar.getInstance();
                    long elapsedTime = now.getTimeInMillis()/1000 - ListOfFlight.get(i).getLastUpdate();

                    //If elapsed time more than 0.5 minutes, then remove the flight data from list
                    if (elapsedTime > 30)
                    {
                        RemoveFlight(ListOfFlight.get(i).getCallSign());
                    }
                }
            }
        }
}
